package util

import (
	"flag"
	"github.com/golang/freetype"
	"image"
	"image/color"
	"image/png"
	"io/ioutil"
	"log"
	. "mock/lib/font/config"
	"os"
)

// charset 中文文字
// horV - H-横排，V-竖排
// out 输出文件名
// font 字体
var (
	Char = flag.String("charset", "你好世界", "text (ZH)")
	HorV = flag.String("horV", "H", "H | V")
	Out  = flag.String("out", "", "output file name")
	Font = flag.String("font", "f1", "f1 | f2")
)

func Generator(charset []string, outPath string, horV string, textFont TextFont) {

	// 打开背景图
	bgFile, err := os.OpenFile("../img/bg.png", os.O_RDONLY, 6)
	if err != nil {
		log.Fatal(err)
	}

	defer bgFile.Close()

	// 解码
	i, err := png.Decode(bgFile)
	if err != nil {
		log.Fatal(err)
	}

	// 图片的宽度
	srcWidth := 640
	// 图片的高度
	srcHeight := 640

	if horV == "H" {
		srcWidth = 640 * len(charset)
	}

	if horV == "V" {
		srcHeight = 640 * len(charset)
	}

	imgFile, _ := os.Create(outPath)
	defer imgFile.Close()
	img := image.NewRGBA(image.Rect(0, 0, srcWidth, srcHeight))

	if horV == "H" {
		log.Println("横向生成，渲染背景...")
		// 根据字符长度创建背景
		for index := 0; index < len(charset); index++ {
			// 复制背景图
			for y := 0; y < srcHeight; y++ {
				for x := index * 640; x < srcWidth; x++ {
					if x < 640 {
						img.Set(x, y, i.At(x, y))
					} else {
						img.Set(x, y, i.At(x-index*640, y))
					}
				}
			}
		}
	}

	if horV == "V" {
		log.Println("竖向生成，渲染背景...")
		// 根据字符长度创建背景
		for index := 0; index < len(charset); index++ {
			// 复制背景图
			for y := index * 640; y < srcHeight; y++ {
				for x := 0; x < srcWidth; x++ {
					if y < 640 {
						img.Set(x, y, i.At(x, y))
					} else {
						img.Set(x, y, i.At(x, y-index*640))
					}
				}
			}
		}
	}

	// 读取字体数据
	fontFileName := "../lib/font/" + textFont.FontName
	fontBytes, err := ioutil.ReadFile(fontFileName)
	log.Printf("加载字体：%s...", textFont.FontName)
	if err != nil {
		log.Fatal(err)
	}

	// 载入字体数据
	font, err := freetype.ParseFont(fontBytes)
	if err != nil {
		log.Println("载入字体失败!", err)
	}
	f := freetype.NewContext()
	// 设置分辨率
	f.SetDPI(100)
	// 设置字体
	f.SetFont(font)
	// 设置尺寸
	f.SetFontSize(textFont.FontSize)
	f.SetClip(img.Bounds())
	// 设置输出的图片
	f.SetDst(img)
	// 设置字体颜色(黑色)
	f.SetSrc(image.NewUniform(color.Black))

	if horV == "H" {
		log.Println("开始绘制对联...")
		// 绘制字符
		for index := 0; index < len(charset); index++ {
			// 设置字体的位置
			pt := freetype.Pt(textFont.X+index*640, textFont.Y)

			_, err = f.DrawString(charset[index], pt)
			if err != nil {
				log.Fatal(err)
			}
		}
	}

	if horV == "V" {
		// 绘制字符
		for index := 0; index < len(charset); index++ {
			// 设置字体的位置
			pt := freetype.Pt(textFont.X, textFont.Y+index*640)

			_, err = f.DrawString(charset[index], pt)
			if err != nil {
				log.Fatal(err)
			}
		}
	}

	// 以png 格式写入文件作为输出
	err = png.Encode(imgFile, img)
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Done.")
}